package com.my.blog.website.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.my.blog.website.dao.DingVoMapper;
import com.my.blog.website.dto.DingDto;
import com.my.blog.website.exception.TipException;
import com.my.blog.website.modal.Vo.DingVo;
import com.my.blog.website.modal.Vo.DingVoExample;
import com.my.blog.website.service.IDingSevice;
import com.my.blog.website.utils.Commons;
import com.my.blog.website.utils.DateKit;
import com.my.blog.website.utils.Node;
import com.my.blog.website.utils.Tools;
import com.vdurmont.emoji.EmojiParser;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author geng
 * @title: DingSeviceImpl
 * @projectName my-blog
 * @description: TODO
 * @date 2020/1/10 -- 14:34
 */
@Service
public class DingSeviceImpl implements IDingSevice {
    private static final Logger log = LoggerFactory.getLogger(ContentServiceImpl.class);


    @Autowired
    private DingVoMapper dingVoMapper;


    @Override
    public int countDings() {
        DingVoExample dingVoExample = new DingVoExample();
        dingVoExample.createCriteria().andDidGreaterThanOrEqualTo(0);
        List<DingVo> list = dingVoMapper.selectByExampleWithBLOBs(dingVoExample);
        return list.size();
    }

    @Override
    public void publish(DingVo dingVo) {
        if (dingVo == null) {
            throw new TipException("打卡对象为空");
        }
        if (StringUtils.isBlank(dingVo.getContent())) {
            throw new TipException("打卡内容不能为空");
        }
        if (null == dingVo.getAuthorId()) {
            throw new TipException("请登录后发布打卡");
        }

        //表情、字符相互转化
        dingVo.setContent(EmojiParser.parseToAliases(dingVo.getContent()));

        int time = DateKit.getCurrentUnixTime();
        dingVo.setCreated(time);
        dingVo.setModified(time);
        dingVo.setStars(0);
        dingVoMapper.insert(dingVo);
    }

    @Override
    public PageInfo<DingVo> getDings(Integer p, Integer limit) {
        log.debug("Enter getDing method");
        DingVoExample dingVoExample = new DingVoExample();
        dingVoExample.setOrderByClause("created desc");
        PageHelper.startPage(p, limit);
        List<DingVo> data = dingVoMapper.selectByExampleWithBLOBs(dingVoExample);
        PageInfo<DingVo> pageInfo = new PageInfo<>(data);
        log.debug("Exit getContents method");
        return pageInfo;
    }

    @Override
    public List<DingDto> findNameAndDing() {
        return dingVoMapper.findNameAndDing();
    }


    @Override
    public PageInfo<DingDto> getDingsByUser(Integer authorId, String orderby, Integer p, Integer limit) {
        if (StringUtils.isBlank(orderby)) {
            orderby = "a.created desc";
        }
        Map<String, Object> paraMap = new HashMap<>();
        paraMap.put("order", orderby);
        paraMap.put("authorId", authorId);
        PageHelper.startPage(p, limit);
        List<DingDto> contentVos = dingVoMapper.selectUserFromDingByUser(paraMap);
        return new PageInfo<>(contentVos);
    }

    @Override
    public DingVo getDings(String id) {
        if (StringUtils.isNotBlank(id)) {
            if (Tools.isNumber(id)) {
                DingVo dingVo = dingVoMapper.selectByPrimaryKey(Integer.valueOf(id));
                /*if (dingVo != null) {
                    contentVo.setHits(contentVo.getHits() + 1);
                    contentDao.updateByPrimaryKey(contentVo);
                }*/
                return dingVo;
            } else {
                throw new TipException("query failed");
            }
        }
        return null;
    }

    @Override
    public void updateDingByDid(DingVo dingVo) {
        if (null != dingVo && null != dingVo.getDid()) {
            dingVoMapper.updateByPrimaryKeySelective(dingVo);
        }
    }

    @Override
    public PageInfo<DingVo> getDings(Integer mid, int page, int limit) {
        return null;
    }

    @Override
    public PageInfo<DingVo> getDings(String keyword, Integer page, Integer limit) {
        return null;
    }

    @Override
    public PageInfo<DingVo> getDingsWithpage(DingVoExample dingVoExample, Integer page, Integer limit) {
        PageHelper.startPage(page, limit);
        List<DingVo> contentVos = dingVoMapper.selectByExampleWithBLOBs(dingVoExample);
        return new PageInfo<>(contentVos);
    }

    //管理员获得所有打卡
    @Override
    public PageInfo<DingDto> getDingsPage(String orderby, Integer page, Integer limit) {
        if (StringUtils.isBlank(orderby)) {
            orderby = "a.created desc";
        }
        Map paraMap = new HashMap<>();
        paraMap.put("order", orderby);
        PageHelper.startPage(page, limit);
        List<DingDto> contentVo = dingVoMapper.selectUserFromDing(paraMap);
        return new PageInfo<>(contentVo);
    }

    //用户获得博客
    @Override
    public PageInfo<DingDto> getDingsPageById(Integer uid, String orderby, Integer page, Integer limit) {
        if (StringUtils.isBlank(orderby)) {
            orderby = "a.created desc";
        }
        Map<String, Object> paraMap = new HashMap<>();
        paraMap.put("order", orderby);
        paraMap.put("uid", uid);
        PageHelper.startPage(page, limit);
        List<DingDto> contentVos = dingVoMapper.selectUserFromDingById(paraMap);
        //  log.info(contentVos.get(0).getScreenName());
        return new PageInfo<>(contentVos);
    }


    @Override
    public void deleteByCid(Integer cid) {
        DingVo dingVo = this.getDings(cid + "");
        if (null != dingVo) {
            dingVoMapper.deleteByPrimaryKey(cid);
        }
    }

    @Override
    public void updateDing(DingVo contents) {
        if (null == contents || null == contents.getDid()) {
            throw new TipException("文章对象不能为空");
        }
        if (StringUtils.isBlank(contents.getContent())) {
            throw new TipException("文章内容不能为空");
        }
        if (null == contents.getAuthorId()) {
            throw new TipException("请登录后发布文章");
        }
        int time = DateKit.getCurrentUnixTime();
        contents.setModified(time);
        Integer cid = contents.getDid();
        contents.setContent(EmojiParser.parseToAliases(contents.getContent()));

        dingVoMapper.updateByPrimaryKeySelective(contents);
    }
}
